"""
代码生成模块

职责:
- 生成C语言头文件
- 支持多种导出模式（单文件、多文件、合并文件）
- 提供代码生成的核心逻辑
"""

from tkinter import messagebox
import os
from file_handler import FileHandler


class CodeGenerator:
    """C语言头文件代码生成器"""
    
    # 常量定义
    DEFAULT_SHEET_NAME = "default"
    
    @staticmethod
    def generate_header_content(config_data, sheet_name=""):
        """
        生成单个工作表的头文件内容
        
        参数:
            config_data (dict): 配置数据，格式: {name: {value: str}}
            sheet_name (str): 工作表名称
            
        返回:
            str: C语言头文件内容
        """
        # 生成头文件保护宏
        guard = f"{sheet_name}_H".upper().replace(" ", "_") if sheet_name and sheet_name != "default" else "CONFIG_H"
        header_content = f"#ifndef {guard}\n#define {guard}\n\n"
        
        if sheet_name and sheet_name != "default":
            header_content += f"// Configuration from {sheet_name}\n\n"
        
        # 生成宏定义
        for name, config in config_data.items():
            value = config["value"]
            # 所有值都作为字符串处理，加引号
            header_content += f'#define {name} "{value}"\n'
        
        header_content += f"\n#endif // {guard}"
        return header_content
    
    @staticmethod
    def generate_single_header(config_data, sheet_name):
        """
        生成单个头文件并保存
        
        参数:
            config_data (dict): 配置数据
            sheet_name (str): 工作表名称
            
        返回:
            bool: 生成成功返回True
        """
        header_content = CodeGenerator.generate_header_content(config_data, sheet_name)
        
        file_path = FileHandler.get_save_file_path(".h")
        
        if file_path:
            if FileHandler.write_file(file_path, header_content):
                messagebox.showinfo("成功", f"C头文件已保存到:\n{file_path}")
                return True
        
        return False
    
    @staticmethod
    def generate_merged_header(sheets):
        """
        生成合并所有工作表数据的单个头文件
        
        参数:
            sheets (dict): 所有工作表数据，格式: {sheet_name: {name: {value: str}}}
            
        返回:
            bool: 生成成功返回True
        """
        header_content = "#ifndef CONFIG_H\n#define CONFIG_H\n\n"
        
        for sheet_name, config_data in sheets.items():
            if sheet_name != "default":
                header_content += f"// ===== {sheet_name} =====\n"
            
            for name, config in config_data.items():
                value = config["value"]
                header_content += f'#define {name} "{value}"\n'
            
            header_content += "\n"
        
        header_content += "#endif // CONFIG_H"
        
        # 保存头文件
        file_path = FileHandler.get_save_file_path(".h")
        
        if file_path:
            if FileHandler.write_file(file_path, header_content):
                messagebox.showinfo("成功", f"C头文件已保存到:\n{file_path}")
                return True
        
        return False
    
    @staticmethod
    def generate_multiple_headers(sheets):
        """
        为每个工作表生成单独的头文件
        
        参数:
            sheets (dict): 所有工作表数据
            
        返回:
            bool: 生成成功返回True
        """
        dir_path = FileHandler.get_directory_path()
        
        if not dir_path:
            return False
        
        try:
            for sheet_name, config_data in sheets.items():
                header_content = CodeGenerator.generate_header_content(config_data, sheet_name)
                
                # 生成文件名
                if sheet_name == "default":
                    filename = "config.h"
                else:
                    # 清理工作表名称以用作文件名
                    safe_name = sheet_name.replace(" ", "_").lower()
                    filename = f"{safe_name}_config.h"
                
                file_path = os.path.join(dir_path, filename)
                
                if not FileHandler.write_file(file_path, header_content):
                    return False
            
            messagebox.showinfo("成功", f"已生成 {len(sheets)} 个C头文件到:\n{dir_path}")
            return True
            
        except Exception as e:
            messagebox.showerror("错误", f"生成头文件失败:\n{str(e)}")
            return False
    
    @staticmethod
    def export_c_header(config_data, sheets_data):
        """
        导出C语言头文件，支持多种模式
        
        参数:
            config_data (dict): 全局配置数据
            sheets_data (dict): 按工作表组织的配置数据
            
        返回:
            bool: 导出成功返回True
        """
        if not config_data:
            messagebox.showwarning("警告", "没有配置数据可生成头文件！")
            return False
        
        # 检查是否有多个工作表
        if len(sheets_data) == 1:
            # 单个工作表，直接生成
            sheet_name = list(sheets_data.keys())[0]
            config = sheets_data[sheet_name]
            return CodeGenerator.generate_single_header(config, sheet_name)
        else:
            # 多个工作表，询问用户
            result = messagebox.askyesnocancel(
                "选择",
                f"检测到 {len(sheets_data)} 个工作表\n\n" +
                "是否要生成单个合并文件？\n\n" +
                "是 - 生成单个文件（所有数据合并）\n" +
                "否 - 为每个工作表生成单独文件\n" +
                "取消 - 返回"
            )
            
            if result is None:
                return False
            elif result:
                return CodeGenerator.generate_merged_header(sheets_data)
            else:
                return CodeGenerator.generate_multiple_headers(sheets_data)
